"""
主窗口类，连接 UI 和服务
"""
from PyQt5.QtWidgets import QMainWindow, QMessageBox
from PyQt5.QtCore import pyqtSlot, QTimer

from app.core.service_locator import ServiceLocator
from app.ui.windows.main_window import MainWindow as UIMainWindow
from app.services.websocket_service import IWebSocketService
from app.services.comment_service import ICommentService
from app.services.ai_service import IAIService
from app.services.speech_service import ISpeechService
from app.services.script_service import IScriptService
from app.services.audio_service import IAudioService
from app.services.config_service import IConfigService
from app.utils.logger import Logger


class MainWindow(UIMainWindow):
    """
    主窗口类，连接 UI 和服务
    """
    
    def __init__(self, service_initializer):
        """
        初始化主窗口
        
        @param service_initializer: 服务初始化器
        """
        # 初始化父类
        super().__init__()
        
        # 保存服务初始化器
        self.service_initializer = service_initializer
        
        # 获取服务定位器
        self.service_locator = ServiceLocator.get_instance()
        
        # 获取日志记录器
        self.logger = Logger.get_logger("main_window")
        
        # 获取服务实例
        self.websocket_service = self.service_locator.get_service_by_type(IWebSocketService)
        self.comment_service = self.service_locator.get_service_by_type(ICommentService)
        self.ai_service = self.service_locator.get_service_by_type(IAIService)
        self.speech_service = self.service_locator.get_service_by_type(ISpeechService)
        self.script_service = self.service_locator.get_service_by_type(IScriptService)
        self.audio_service = self.service_locator.get_service_by_type(IAudioService)
        self.config_service = self.service_locator.get_service_by_type(IConfigService)
        
        # 连接服务事件
        self._connect_service_events()
        
        # 加载配置
        self._load_config()
        
        # 设置定时器，定期更新评论列表
        self.update_timer = QTimer(self)
        self.update_timer.timeout.connect(self._update_comment_list)
        self.update_timer.start(1000)  # 每秒更新一次
        
        self.logger.info("主窗口初始化完成")
    
    def _connect_service_events(self):
        """
        连接服务事件
        """
        # WebSocket 服务事件
        self.websocket_service.add_listener("connection_status_changed", self._on_connection_status_changed)
        
        # 评论服务事件
        self.comment_service.add_listener("comment_processed", self._on_comment_processed)
        
        # AI 服务事件
        self.ai_service.add_listener("comment_analyzed", self._on_comment_analyzed)
        self.ai_service.add_listener("reply_generated", self._on_reply_generated)
        
        # 语音服务事件
        self.speech_service.add_listener("speech_synthesized", self._on_speech_synthesized)
        self.speech_service.add_listener("speech_status_changed", self._on_speech_status_changed)
        
        # 音频服务事件
        self.audio_service.add_listener("audio_playback_started", self._on_audio_playback_started)
        self.audio_service.add_listener("audio_playback_completed", self._on_audio_playback_completed)
        self.audio_service.add_listener("audio_playback_failed", self._on_audio_playback_failed)
    
    def _load_config(self):
        """
        加载配置
        """
        # 加载 WebSocket URL
        websocket_url = self.config_service.get("websocket.url", "")
        if websocket_url:
            self.url_input.setText(websocket_url)
        
        # 加载音量设置
        volume = self.config_service.get("audio.volume", 1.0)
        self.volume_slider.setValue(int(volume * 100))
        self.volume_value_label.setText(f"{int(volume * 100)}%")
    
    def _update_comment_list(self):
        """
        更新评论列表
        """
        # 获取最近的评论
        comments = self.comment_service.get_recent_comments(50)
        
        # 更新评论列表
        self.comment_list.set_comments(comments)
    
    @pyqtSlot()
    def _on_connect_clicked(self):
        """
        连接按钮点击事件处理
        """
        # 获取 WebSocket URL
        url = self.url_input.text().strip()
        if not url:
            QMessageBox.warning(self, "警告", "请输入有效的 WebSocket URL")
            return
        
        # 保存 URL 到配置
        self.config_service.set("websocket.url", url)
        self.config_service.save_config()
        
        # 更新 UI 状态
        self.connect_button.setEnabled(False)
        self.disconnect_button.setEnabled(True)
        self.url_input.setEnabled(False)
        self.connection_status.setText("正在连接...")
        
        # 连接 WebSocket
        self.websocket_service.connect(url)
    
    @pyqtSlot()
    def _on_disconnect_clicked(self):
        """
        断开连接按钮点击事件处理
        """
        # 断开 WebSocket 连接
        self.websocket_service.disconnect()
        
        # 更新 UI 状态
        self.connect_button.setEnabled(True)
        self.disconnect_button.setEnabled(False)
        self.url_input.setEnabled(True)
        self.connection_status.setText("已断开连接")
    
    @pyqtSlot(object)
    def _on_comment_selected(self, comment):
        """
        评论选中事件处理
        
        @param comment: 选中的评论对象
        """
        # 分析评论
        self.ai_service.analyze_comment(comment)
    
    @pyqtSlot()
    def _on_speak_clicked(self):
        """
        朗读按钮点击事件处理
        """
        # 获取 AI 回复文本
        text = self.ai_response_text.toPlainText().strip()
        if not text:
            QMessageBox.warning(self, "警告", "没有可朗读的内容")
            return
        
        # 合成语音
        self.speech_service.synthesize(text)
    
    @pyqtSlot()
    def _on_play_clicked(self):
        """
        播放按钮点击事件处理
        """
        # TODO: 实现播放逻辑，需要知道当前的音频文件
        pass
    
    @pyqtSlot()
    def _on_pause_clicked(self):
        """
        暂停按钮点击事件处理
        """
        # TODO: 实现暂停逻辑
        pass
    
    @pyqtSlot()
    def _on_stop_clicked(self):
        """
        停止按钮点击事件处理
        """
        # 停止当前播放
        self.audio_service.stop_playback()
    
    @pyqtSlot(int)
    def _on_volume_changed(self, value):
        """
        音量滑块值变化事件处理
        
        @param value: 音量值（0-100）
        """
        # 更新音量值标签
        self.volume_value_label.setText(f"{value}%")
        
        # 设置音频服务音量
        volume = value / 100.0  # 转换为 0.0-1.0 范围
        self.audio_service.set_volume(volume)
        
        # 保存音量设置到配置
        self.config_service.set("audio.volume", volume)
        self.config_service.save_config()
    
    def _on_connection_status_changed(self, event):
        """
        连接状态变化事件处理
        
        @param event: 事件对象
        """
        status = event.data
        self.connection_status.setText(status)
        
        # 根据状态更新 UI
        if status == "已连接":
            self.connect_button.setEnabled(False)
            self.disconnect_button.setEnabled(True)
            self.url_input.setEnabled(False)
        elif status == "未连接" or status == "连接失败" or status == "已断开连接":
            self.connect_button.setEnabled(True)
            self.disconnect_button.setEnabled(False)
            self.url_input.setEnabled(True)
    
    def _on_comment_processed(self, event):
        """
        评论处理完成事件处理
        
        @param event: 事件对象
        """
        # 评论已处理，更新评论列表
        self._update_comment_list()
    
    def _on_comment_analyzed(self, event):
        """
        评论分析完成事件处理
        
        @param event: 事件对象
        """
        # 获取分析结果
        result = event.data
        
        # 更新 AI 回复文本框
        if result and result.reply:
            self.ai_response_text.setText(result.reply)
            self.speak_button.setEnabled(True)
            self.copy_button.setEnabled(True)
    
    def _on_reply_generated(self, event):
        """
        回复生成事件处理
        
        @param event: 事件对象
        """
        # 获取回复数据
        data = event.data
        reply = data.get("reply", "")
        
        # 更新 AI 回复文本框
        if reply:
            self.ai_response_text.setText(reply)
            self.speak_button.setEnabled(True)
            self.copy_button.setEnabled(True)
    
    def _on_speech_synthesized(self, event):
        """
        语音合成完成事件处理
        
        @param event: 事件对象
        """
        # 获取语音记录
        record = event.data
        
        # 更新 UI 状态
        self.play_button.setEnabled(True)
        self.pause_button.setEnabled(False)
        self.stop_button.setEnabled(False)
    
    def _on_speech_status_changed(self, event):
        """
        语音状态变化事件处理
        
        @param event: 事件对象
        """
        # 获取语音记录
        record = event.data
        
        # 根据状态更新 UI
        if record.status == "completed":
            self.play_button.setEnabled(True)
            self.pause_button.setEnabled(False)
            self.stop_button.setEnabled(False)
        elif record.status == "processing":
            self.play_button.setEnabled(False)
            self.pause_button.setEnabled(False)
            self.stop_button.setEnabled(True)
    
    def _on_audio_playback_started(self, event):
        """
        音频播放开始事件处理
        
        @param event: 事件对象
        """
        # 更新 UI 状态
        self.play_button.setEnabled(False)
        self.pause_button.setEnabled(True)
        self.stop_button.setEnabled(True)
    
    def _on_audio_playback_completed(self, event):
        """
        音频播放完成事件处理
        
        @param event: 事件对象
        """
        # 更新 UI 状态
        self.play_button.setEnabled(True)
        self.pause_button.setEnabled(False)
        self.stop_button.setEnabled(False)
    
    def _on_audio_playback_failed(self, event):
        """
        音频播放失败事件处理
        
        @param event: 事件对象
        """
        # 获取音频项
        item = event.data
        
        # 显示错误消息
        QMessageBox.warning(self, "播放失败", f"音频播放失败: {item.error}")
        
        # 更新 UI 状态
        self.play_button.setEnabled(True)
        self.pause_button.setEnabled(False)
        self.stop_button.setEnabled(False) 